#ifndef _KC_SENDER_H__KC_
#define _KC_SENDER_H__KC_

#include <string>
#include "../data/Command.h"
#include "../data/Reply.h"
#include "../data/SMTPDefaults.h"
#include "../../comm/ssl/SSLClient.h"
#include "../../mime/data/RawMessage.h"
#include "../../logs/Logger.h"

namespace kc_sf
{
	class Sender
	{
		public:

			Sender();

			void connectToServer( const std::string &srv_name, int port );
			bool sendMail( const RawMessage &msg );
			void disconnect ();

		private:

			std::string s_fqdn;
			TCPClient s_client;
			Logger s_logger;

			bool recvGreetings();
			bool sendHelo();
			bool sendEhlo();
			bool sendAuthPlain();
			bool sendMailFrom( const RawMessage &msg );
			bool sendToRcpts( const RawMessage &msg );
			bool sendData( const RawMessage &msg );
			bool sendQuit();

			bool recvReply( Reply &reply, int timeout_s = DEF_SENDER_TIMEOUT_S );
			void sendCommand( const Command &cmd, int timeout_s = DEF_SENDER_TIMEOUT_S );
			void sendText( const std::string &text, int timeout_s = DEF_SENDER_TIMEOUT_S );
			bool sendMailData( const std::string &msg_data );

			void checkConnection ();
			bool isLastLine( const std::string &line ) const;  // czy jest ostatnia linia odpowiedzi serwera
			bool fillReply( const std::string &line, Reply &reply ) const;  // wydzieala z napisu kod odpowiedzi serwera i towarzyszacy mu napis, kod jest zmieniany tylko jesli odpowiedz nie posiada jeszcze ustawionej tej wartosci
	};
}

#endif // _KC_SENDER_H__KC_
